package kr.co.pension.utils;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;

public class OcbTcpClient {
	public OcbTcpClient() {

	}

	public boolean request(String data) {
		Socket xSocket = null;
		OutputStream out = null;
		InputStream is = null;

//		String dt = "A0104810201203081053320051375323ON0000            ";
		String dt ="A1004810201203081053320051375323ON0586            001AA1            030014779       1302494498201203081053329420235086498842                          0121N0000009000020000009000000009000                                     00000900000000900000000000000000000001 000                                                                                                                                                                                                                                                                                                                                                                                   ";
		try {
			// 접속 대상 IP 및 PORT로 소켓을 구성할 수 있다.
			// 생성자 내에서 Connetion까지 자동으로 맺는다.
			xSocket = new Socket("203.235.207.155", 20481);
			// 동기화 처리를 위한 부분으로 서버에 연결 후 1분의 대기 시간을 설정해 둔다.
			// 대개 사용하지 않으므로 필요시에만 사용하자.
			 xSocket.setSoTimeout(3000);

			// 소켓의 outputstream에 데이터를 쓰고 버퍼를 비우자(flush)
			out = xSocket.getOutputStream();
			out.write(dt.getBytes());
			out.flush();

			// 동기 처리 부분 주석 처리
			// 위의 동기화 처리를 위한 부분이므로 같이 필요시에만 사용하자.
			is = xSocket.getInputStream();
			int count = 0;
			String tmp = "";
			String rcvFullData = "";
			byte[] buffer = new byte[1024];

			if ((count = is.read(buffer)) != -1) {
				System.out.println(buffer);
				rcvFullData += new String(buffer,"EUC-KR");
			}
//			rcvFullData = rcvFullData.trim();
			System.out.println("rcv Data : "+rcvFullData);
		}
		// 대기 시간이 지나면 SocketTimeoutException이 발생한다.
		catch (SocketTimeoutException ste) {
			System.out.println(ste.getMessage());
			return false;
		} catch (SocketException se) {

			System.out.println(se.getMessage());
			return false;
		} catch (Exception e) {
			System.out.println(e.getMessage());
			return false;
		}
		// 해당 작업이 끝나면 stream 및 소켓을 닫고 메모리를 해제하자.
		// 이 부분은 클라이언트 포트의 재사용을 위해 반드시 필요하다.
		finally {
			try {
				if (is != null) {
					is.close();
					is = null;
				}
				if (out != null) {
					out.close();
					out = null;
				}
				if (xSocket != null) {
					xSocket.close();
					xSocket = null;
				}
			} catch (Exception ex) {
				System.out.println(ex.getMessage());
			}
		}
		return true;
	}

	public static void main(String[] args) {
		new OcbTcpClient().request("클라이언트 테스트");
	}
}
